package com.bestdreamer.thread_create;

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;

/**
 * 实现 Callable 接口来实现线程类
 * 【注意】Callable 接口是 Java5 新增的接口，而且它不是 Runnable 接口的子接口，所以 Callable 对象不能直接作为 Thread 的 target。
 * 【注意】Callable 接口有泛型限制，Callable 接口里的泛型形参类型与 call() 方法返回值类型类型相同
 */
public class Thread3 implements Callable<Integer>{

    // 实现 call() 方法，作为线程执行体
    public Integer call() throws Exception {
        int i = 0;
        for( ; i < 100; i++){
            System.out.println(Thread.currentThread().getName() + " " + i);
        }
        // call() 方法可以有返回值
        return i;
    }

    public static void main(String[] args){
        // 创建 Callable 对象
        Thread3 t3 = new Thread3();
        // 使用 FutureTask 来包装 Callable 对象
        FutureTask<Integer> task = new FutureTask<Integer>(t3);
        for( int i = 0; i < 100; i++){
            System.out.println(Thread.currentThread().getName() + " " + i);
            if(i == 20){
                // 实质还是以 Callable 对象来创建并启动线程
                new Thread(task,"有返回值的线程").start();
            }
        }
        try{
            // 获取线程返回值
            System.out.println("子线程的返回值："+task.get());
        }catch (Exception e){
            e.printStackTrace();
        }
    }
}
